package ar.edu.utn.frba.dds.aterrizar;

import java.util.ArrayList;

import org.junit.Before;
import org.junit.Test;

import com.lanchita.AerolineaLanchita;
import com.lanchita.excepciones.CodigoErroneoException;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

public class AerolineaLanchitaTest {
	Usuario usuarioEstandar = new Usuario("Pepo",new Estandar(),"Pepon","1.232.321");
	Usuario usuarioVIP = new Usuario("Pipo",new VIP(),"Pipon","36.200.287");
	Usuario usuarioNoPaga = new Usuario("Pepe",new NoPaga(),"Pompin","20.456.058");
	ArrayList<String> busquedaUsuario1 = new ArrayList<String>();
	AerolineaLanchita mockAerolineaLanchita;
	AerolineaLanchita mockitoLanchita;
	OperadorDeAerolineas InstanciaOperadorDeAerolineas = OperadorDeAerolineas.getInstance();
	ArrayList<Condiciones> condiciones = new ArrayList<Condiciones>();
	
	@Before
	public void setUp() {
	mockAerolineaLanchita = mock(AerolineaLanchita.class);
	mockitoLanchita = mockAerolineaLanchita.getInstance();
	busquedaUsuario1.add(0, "BUE");		//ORIGEN
	busquedaUsuario1.add(1, "20121010");//DESTINO
	busquedaUsuario1.add(2, null);		//FECHA SALIDA
	busquedaUsuario1.add(3, "LA");		//HORA SALIDA
	busquedaUsuario1.add(4, null);		//FECHA LLEGADA
	busquedaUsuario1.add(5, null);		//HORA LLEGADA
	}

	@Test (expected = CodigoErroneoException.class)
	public void comprarUnAsientoDeCodigoInvalido() {
		usuarioEstandar.comprarVuelo(mockitoLanchita, "kjhfjsdgf<dgfdh");
	}
	
	@Test
	public void calculoDePrecioDeUnVueloParaUsuarioEstandar() {
		assertEquals(183.885, InstanciaOperadorDeAerolineas.calcularPrecioDeUnVuelo(mockitoLanchita, "01202022220202-3", usuarioEstandar), 0.001);
	}
	
	@Test
	public void calculoDePrecioDeUnVueloParaUsuarioVIP() {
		assertEquals(183.885, InstanciaOperadorDeAerolineas.calcularPrecioDeUnVuelo(mockitoLanchita, "01202022220202-3", usuarioVIP), 0.001);
	}
	
	@Test
	public void calculoDePrecioDeUnVueloParaUsuarioNoPaga() {
		assertEquals(203.885, InstanciaOperadorDeAerolineas.calcularPrecioDeUnVuelo(mockitoLanchita, "01202022220202-3", usuarioNoPaga), 0.001);
	}
	
	@Test
	public void alComprarUnVueloPasaAEstarReservado() {
		Vuelo vueloPreCompra = InstanciaOperadorDeAerolineas.encontrarVueloPorCodigo(mockitoLanchita, "01202022220202-3");
		assertEquals("D", vueloPreCompra.getEstado());
		usuarioEstandar.comprarVuelo(mockitoLanchita, "01202022220123-3");
		Vuelo vueloPostCompra = InstanciaOperadorDeAerolineas.encontrarVueloPorCodigo(mockitoLanchita, "01202022220202-3");
		assertEquals("C", vueloPostCompra.getEstado());
	}
	
	@Test
	public void cantidadVuelosParaUnUsuarioVIPconRestriccionesExtra() {
		ArrayList<Vuelo> vuelos = usuarioVIP.buscarVuelo(mockitoLanchita, busquedaUsuario1, condiciones);
		assertEquals(10, vuelos.size());
	}
	
	@Test
	public void cantidadVuelosParaUnUsuarioEstandarconRestriccionesExtra() {
		ArrayList<Vuelo> vuelos = usuarioEstandar.buscarVuelo(mockitoLanchita, busquedaUsuario1, condiciones);
		assertEquals(3, vuelos.size());
	}
	
	@Test
	public void cantidadVuelosParaUnUsuarioNoPagaconRestriccionesExtra() {
		ArrayList<Vuelo> vuelos = usuarioNoPaga.buscarVuelo(mockitoLanchita, busquedaUsuario1, condiciones);
		assertEquals(3, vuelos.size());
	}
	
}